7. 레이아웃 기법
웹 페이지의 레이아웃은 사용자 경험에 큰 영향을 미칩니다. CSS는 다양한 레이아웃 기법을 제공하며, 특히 Flexbox와 CSS Grid는 현대 웹 디자인에서 필수적인 도구로 자리 잡고 있습니다. 이 섹션에서는 Flexbox와 CSS Grid를 이용한 레이아웃 구성 방법과 포지셔닝 및 display
속성을 이해하는 방법을 다룹니다.
7.1 Flexbox를 이용한 레이아웃 구성
Flexbox(Flexible Box Layout)는 요소들을 한 줄 또는 여러 줄로 정렬하고, 쉽게 배치할 수 있는 강력한 레이아웃 도구입니다. 주로 1차원 레이아웃(한 방향으로 배열)에 사용됩니다.
7.1.1 Flexbox 기본 속성
-
display: flex: 부모 요소에 적용하여 Flexbox 컨테이너를 만듭니다.
-
flex-direction: 자식 요소들이 배치되는 방향을 설정합니다. 기본값은 row이며, column, row-reverse, column-reverse 등을 사용할 수 있습니다.
-
justify-content: 주축(메인 축)에서 자식 요소의 정렬을 설정합니다. flex-start, flex-end, center, space-between, space-around 등이 있습니다.
-
align-items: 교차축(크로스 축)에서 자식 요소의 정 렬을 설정합니다. stretch(기본값), flex-start, flex-end, center 등을 사용할 수 있습니다.
-
flex-wrap: 자식 요소들이 한 줄에 맞지 않을 때 줄 바꿈 여부를 설정합니다. 기본값은 nowrap이며, wrap, wrap-reverse도 사용할 수 있습니다.
.container {
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
}
7.1.2 Flexbox 실습 예제
여기[https://playcode.io/css]에서 실습을 해볼까요. 링크 접속 후 html 부분에 아래 코드를 복붙하고, 하나씩 속성들을 바꿔봅시다.
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
<style>
.container {
display: flex;
justify-content: space-around; /* flex-start, flex-end, center, space-between */
align-items: center; /* stretch(기본값), flex-start, flex-end, center */
height: 100vh;
}
.item {
background-color: #f1f1f1;
padding: 20px;
margin: 10px;
}
</style>
7.2 CSS Grid를 이용한 레이아웃 구성
CSS Grid는 2차원 레이아웃(행과 열 모두)에 적합하며, 복잡한 레이아웃을 보다 쉽게 구성할 수 있는 도구입니다.
7.2.1 CSS Grid 기본 속성
-
display: grid: 부모 요소에 적용하여 Grid 컨테이너를 만듭니다.
-
grid-template-columns: 그리드의 열 크기를 설정합니다. 비율(fr), 픽셀, 퍼센트 등을 사용할 수 있습니다.
-
grid-template-rows: 그리드의 행 크기를 설정합니다.
-
grid-gap: 그리드 아이템 사이의 간격을 설정합니다.
-
grid-area: 특정 그리드 아이템이 차지할 위치를 설정합니다.
.grid-container {
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* 3개의 동일한 크기의 열 */
grid-template-rows: 200px auto 100px;
grid-gap: 10px;
}
.grid-item {
grid-area: 1 / 1 / 2 / 3; /* 첫 번째 행, 첫 번째 열에서 두 번째 행, 세 번째 열까지 차지 */
}
7.2.2 CSS Grid 실습 예제
마찬가지로 여기[https://playcode.io/css]에서 실습을 해볼까요.
<div class="grid-container">
<div class="grid-item">1</div>
<div class="grid-item">2</div>
<div class="grid-item">3</div>
<div class="grid-item">4</div>
<div class="grid-item">5</div>
<div class="grid-item">6</div>
</div>
<style>
.grid-container {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
grid-template-rows: 100px auto;
grid-gap: 10px;
}
.grid-item {
background-color: #b1b1b1;
padding: 20px;
text-align: center;
}
</style>
7.3 포지셔닝과 display 속성 이해
CSS에서 레이아웃을 구성하는 중요한 요소는 포지셔닝과 display 속성입니다.
7.3.1 포지셔닝
포지셔닝은 요소의 위치를 제어하는 중요한 방법입니다.
-
static: 기본값으로, 요소는 HTML 문서의 흐름에 따라 위치합니다.
-
relative: 요소의 원래 위치를 기준으로 이동합니다.
-
absolute: 부모 요소를 기준으로 위치하며, 문서 흐름에서 제거됩니다.
-
fixed: 화면을 기준으로 고정되어, 스크롤해도 위치가 변하지 않습니다.
.element-static {
position: static;
}
.element-relative {
position: relative;
top: 10px;
left: 5px;
}
.element-absolute {
position: absolute;
top: 50px;
right: 20px;
}
.element-fixed {
position: fixed;
bottom: 10px;
left: 0;
}
7.3.2 포지셔닝 실습
element의 position 속성말고도, 부모가되는 container의 position 속성도 제어해보자.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Positioning Practice</title>
<style>
/* 공통 스타일 */
.box {
width: 100px;
height: 100px;
color: white;
text-align: center;
line-height: 100px;
margin: 20px;
}
.container {
width: 100%;
height: 200px;
position: relative;
background-color: #f3f3f3;
margin-bottom: 50px;
}
/* Positioning Styles */
.element-static {
position: static;
background-color: #3498db;
}
.element-relative {
position: relative;
top: 10px;
left: 5px;
background-color: #e74c3c;
}
.element-absolute {
position: absolute;
top: 50px;
right: 20px;
background-color: #2ecc71;
}
.element-fixed {
position: fixed;
bottom: 10px;
left: 0;
background-color: #f1c40f;
}
</style>
</head>
<body>
<h1>Positioning Practice</h1>
<!-- Static Position Example -->
<div class="container">
<div class="box element-static">Static</div>
</div>
<!-- Relative Position Example -->
<div class="container">
<div class="box element-relative">Relative</div>
</div>
<!-- Absolute Position Example -->
<div class="container">
<div class="box element-absolute">Absolute</div>
</div>
<!-- Fixed Position Example -->
<div class="container">
<div class="box element-fixed">Fixed</div>
</div>
</body>
</html>